/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modele.dao;

import modele.baseDeDonnees.BaseDeDonnees;
import beans.Equipe;
import beans.Etudiant;
import beans.Formateur;
import beans.Module;
import beans.Projet;
import java.sql.Connection;
import java.util.ArrayList;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author Rami
 */
public class GestionProjetDAO {

    /**
     * Methode permettant l'execution d'une requete SQL .
     * @precondition : id de projet valide
     * @postcondition : récupérer tous les details d'un projet
     * @param idProjet numéro du projet à rechercher
     * @return Projet p contenant tous les details du projet voulu
     * @throws Exception  L'execution de la requete sql peut engendrer des Exceptions SQL
     */
    public static Projet rechercherDetailProjet(int idProjet) throws Exception {
        Projet p = new Projet();

        p.setIdProjet(idProjet);
        Connection c = BaseDeDonnees.seConnecterBD();
        Statement requete = c.createStatement();
        ResultSet reponse;
        //REQUETE SQL DE TYPE Renvoi le  projet numero idProjet
        reponse = requete.executeQuery("SELECT 	projet.nom ,projet.id_session, projet.date_debut , projet.date_fin , projet.description " + "FROM     projet " + "WHERE    projet.id_projet = " + idProjet + " ;");
        while (reponse.next()) {
            p.setNom(reponse.getString("nom"));
            p.setDateDebut(reponse.getDate("date_debut"));
            p.setPromotion(reponse.getInt("id_session"));
            p.setDateFin(reponse.getDate("date_fin"));
            p.setDescriptif(reponse.getString("description"));
        }
        reponse.close();
        requete.close();
        c.close();

        Connection c2 = BaseDeDonnees.seConnecterBD();
        Statement requete2 = c2.createStatement();
        // REQUETE SQL DE TYPE Renvoi liste de formateurs avec id projet
        ResultSet reponse2 = requete2.executeQuery("SELECT formateur.id_formateur , formateur.nom , formateur.prenom, formateur.email " + "FROM     projet, formateur, projet_formateur " + "WHERE    projet.id_projet = projet_formateur.id_projet " + "AND      projet_formateur.id_formateur = formateur.id_formateur " + "AND      projet.id_projet = " + idProjet + ";");
        ArrayList<Formateur> listeFormateur = new ArrayList<Formateur>();
        while (reponse2.next()) {
            Formateur f = new Formateur(reponse2.getInt("id_formateur"), reponse2.getString("nom"), reponse2.getString("prenom"), reponse2.getString("email"));
            listeFormateur.add(f);
        }
        p.setFormateurs(listeFormateur);
        reponse2.close();
        requete2.close();
        c2.close();


        Connection c3 = BaseDeDonnees.seConnecterBD();
        Statement requete3 = c3.createStatement();
        // REQUETE SQL DE TYPE Renvoi liste des modules avec id projet
        ResultSet reponse3 = requete3.executeQuery("SELECT module.id_module , module.nom " + "FROM     projet, module, projet_module " + "WHERE    projet.id_projet = projet_module.id_projet " + "AND      projet_module.id_module = module.id_module " + "AND      projet.id_projet = " + idProjet + ";");
        ArrayList<Module> listeModules = new ArrayList<Module>();
        while (reponse3.next()) {
            Module m = new Module(reponse3.getInt(1), reponse3.getString(2));
            listeModules.add(m);
        }
        reponse3.close();
        requete3.close();
        c3.close();
        p.setModules(listeModules);

        Connection c4 = BaseDeDonnees.seConnecterBD();
        Statement requete4 = c4.createStatement();
        // REQUETE SQL liste des equipes ASSOCIEES au PROJET (projet_id)
        ResultSet reponse4 = requete4.executeQuery("SELECT equipe.id_equipe " + "FROM     projet, equipe " + "WHERE    projet.id_projet = equipe.id_projet " + "AND      projet.id_projet = " + idProjet + " ;");
        ArrayList<Equipe> listeEquipes = new ArrayList<Equipe>();
        while (reponse4.next()) {
            Equipe equipe = new Equipe(reponse4.getInt(1));
            listeEquipes.add(equipe);
        }
        reponse4.close();
        requete4.close();
        c4.close();
        //Recupération des Listes de membres de chaque equipe associées au projet
        for (int j = 0; j < listeEquipes.size(); j++) {
            Connection cD = BaseDeDonnees.seConnecterBD();
            Statement requeteD = cD.createStatement();
            // REQUETE SQL liste des membres de cette equipe ( idequipe )
            ResultSet reponseD = requeteD.executeQuery("SELECT etudiant.id_etudiant , etudiant.nom, etudiant.prenom " + "FROM     equipe, membre_equipe, etudiant, projet " + "WHERE    equipe.id_equipe = membre_equipe.id_equipe " + "AND      membre_equipe.id_etudiant = etudiant.id_etudiant " + "AND      equipe.id_equipe = " + listeEquipes.get(j).getIdEquipe() + " " + "AND      projet.id_projet = " + idProjet + ";");
            ArrayList<Etudiant> listeEtudiants = new ArrayList<Etudiant>();
            while (reponseD.next()) {
                Etudiant etudiant = new Etudiant(reponseD.getInt("id_etudiant"), reponseD.getString("nom"), reponseD.getString("prenom"), "email");
                listeEtudiants.add(etudiant);
            }
            listeEquipes.get(j).setEtudiants(listeEtudiants);
            reponseD.close();
            requeteD.close();
            cD.close();
        }
        p.setEquipes(listeEquipes);
        return p;


    }

    /**
     * Methode permettant la creation d'un projet dans la BDD . But : Création d'un projet
     *
     * @precondition : les données entrzntes doivent etre valide
     * @postcondition : Le projet doit etre crée en BDD
     *
     * @param nom Nom du projet
     * @param description Description du projet
     * @param debut Date de debut du projet
     * @param fin Date de fin du projet
     * @param listeModules Liste des modules du projet
     * @param listeFormateurs Liste des intervenants du projet
     * @param listeEquipes Liste des Equipes du projet
     * @param promotion Promotion du projet (1=M1FIC 2=M1FA 3=M2FIC 4=M2FA)
     * @return String contenant le numéro du projet créee
     * @throws Exception L'execution de la requete sql peut engendrer des Exceptions SQL
     */
    public static String creerProjet(String nom, String description, Date debut, Date fin, ArrayList<Module> listeModules, ArrayList<Formateur> listeFormateurs, ArrayList<Equipe> listeEquipes, int promotion) throws Exception {

        Connection c = BaseDeDonnees.seConnecterBD();
        Statement requete = c.createStatement();

        requete.execute("INSERT INTO projet VALUES (" + "(SELECT nextval('projet_id_projet_seq') )," + "'" + nom + "'," + "'" + debut.toString() + "'," + "'" + fin.toString() + "'," + promotion + "," + "'" + description + "');");
        //Création des equipes du projet
        for (int i = 0; i < listeEquipes.size(); i++) {
            requete.execute("INSERT INTO equipe VALUES (" + "(SELECT nextval('equipe_id_equipe_seq'))," + "'" + listeEquipes.get(i).getNom() + "'," + "(SELECT currval('projet_id_projet_seq'))," + "'Sujet a definir'); ");
            for (int j = 0; j < listeEquipes.get(i).getEtudiants().size(); j++) {
                requete.execute("INSERT INTO membre_equipe VALUES " + "((SELECT currval('equipe_id_equipe_seq')), " + "'" + listeEquipes.get(i).getEtudiants().get(j).getIdEtudiant() + "');");
            }
        }
        //Création des formateurs du projet
        for (int i = 0; i < listeFormateurs.size(); i++) {
            requete.execute("INSERT INTO projet_formateur VALUES " + "((SELECT currval('projet_id_projet_seq'))," + listeFormateurs.get(i).getIdFormateur() + ");");
        }
        //Création des matiere associé au projet
        for (int i = 0; i < listeModules.size(); i++) {
            requete.execute("INSERT INTO projet_module VALUES " + "((SELECT currval('projet_id_projet_seq')), " + "'" + listeModules.get(i).getIdModule() + "');");
        }
        // On récupère ici le numéro ID du projet qui vient d'etre créer en base de donnée
        int id = 1;

        ResultSet reponseId = requete.executeQuery("SELECT currval('projet_id_projet_seq') ; ");
        while (reponseId.next()) {
            id = reponseId.getInt(1);
        }
        requete.close();

        reponseId.close();
        c.close();
        return "" + id;

    }

    /**
     * Suppression du projet.
     * @precondition : id projet recu doit exister en BDD
     * @postcondition : le projet est supprimer de la BDD
     * @param idProjet numero du projet a supprimer
     * @return String resultat du traitement ( "Ok" ou "Erreur" )
     * @throws Exception L'execution de la requete sql peut engendrer des Exceptions SQL
     */
    public static String supprimerProjet(int idProjet) throws Exception {
        Connection c = BaseDeDonnees.seConnecterBD();
        Statement requete = c.createStatement();
        boolean retour = requete.execute("DELETE FROM projet WHERE id_projet = " + idProjet + ";");
        requete.close();
        c.close();
        if (retour) {
            return "Ok";
        } else {
            return "Erreur";
        }


    }



    /**
     * Recherche MultiCriteres
     *
     * @precondition : avoir un idModule , un idFormateur , un idPromotion valide ( 0 = tous )
     * @postcondition : renvoi une liste de Projets repondant a la recherche voulu
     * @param promotion id de la promotion ( 0= toutes les promotions )
     * @param idModule id du module ( 0= tous les modules )
     * @param idFormateur id du formateur ( 0 = tous les formateurs )
     * @return ArrayList<Projet> les projets issus de la recherche.
     * @throws Exception L'execution de la requete sql peut engendrer des Exceptions SQL
     */
    public static ArrayList<Projet> rechercher(int promotion, int idModule, int idFormateur) throws Exception {
        Connection c = BaseDeDonnees.seConnecterBD();
        Statement requete = c.createStatement();
        ResultSet reponse;
        ArrayList<Projet> listeProjets = new ArrayList<Projet>();
        if (promotion == 0) {
            if (idModule == 0) {
                if (idFormateur == 0) {
                    //---REQUETE SQL DE TYPE TOUS LES PROJETS
                    reponse = requete.executeQuery("SELECT * FROM projet;");
                } else {
                    //---REQUETE SQL DE TYPE TOUS LES PROJETS de l' INTERVENANT (idIntervenant)
                    reponse = requete.executeQuery("SELECT * " + "FROM projet, projet_formateur, formateur " + "WHERE 	formateur.id_formateur = '" + idFormateur + "' " + "AND  projet_formateur.id_projet = projet.id_projet " + "AND	projet_formateur.id_formateur = formateur.id_formateur;");
                }
            } else {
                if (idFormateur == 0) {
                    //  REQUETE SQL DE TYPE TOUS LES PROJETS du MODULE (idModule)
                    reponse = requete.executeQuery("SELECT * " + "FROM 	projet, module,	projet_module " + "WHERE	module.id_module = '" + idModule + "' " + "AND 	projet_module.id_module = module.id_module " + "AND 	projet_module.id_projet = projet.id_projet;");
                } else {
                    //REQUETE SQL DE TYPE TOUS LES PROJETS du MODULE (idModule) et de l Intervenant ( idIntervenant )
                    reponse = requete.executeQuery("SELECT * " + "FROM 	projet, module, formateur, projet_module, projet_formateur " + "WHERE 	module.id_module = '" + idModule + "' " + "AND 	projet_module.id_module = module.id_module " + "AND      projet_module.id_projet = projet.id_projet " + "AND      formateur.id_formateur = '" + idFormateur + "' " + "AND 	projet_formateur.id_projet = projet.id_projet " + "AND 	projet_formateur.id_formateur = formateur.id_formateur;");
                }
            }
        } else {
            if (idModule == 0) {
                if (idFormateur == 0) {
                    //REQUETE SQL DE TYPE TOUS LES PROJETS de LA PROMO (idPromo)
                    reponse = requete.executeQuery("SELECT * " + "FROM 	projet, session_diplome " + "WHERE 	session_diplome.id_session = '" + promotion + "' " + "AND 	projet.id_session = session_diplome.id_session;  ");
                } else {
                    //REQUETE SQL DE TYPE TOUS LES PROJETS de l' INTERVENANT (idIntervenant)pour  LA PROMO (idPromo)
                    reponse = requete.executeQuery("SELECT * " + "FROM 	projet, session_diplome,projet_formateur,formateur " + "WHERE 	session_diplome.id_session = '" + promotion + "' " + "AND 	projet.id_session = session_diplome.id_session " + "AND	formateur.id_formateur = '" + idFormateur + "' " + "AND 	projet_formateur.id_projet = projet.id_projet " + "AND	projet_formateur.id_formateur = formateur.id_formateur;");
                }
            } else {
                if (idFormateur == 0) {
                    //REQUETE SQL DE TYPE TOUS LES PROJETS du MODULE (idModule) pour LA PROMO (idPromo)
                    reponse = requete.executeQuery("SELECT * " + "FROM 	projet, session_diplome, module, projet_module " + "WHERE	session_diplome.id_session = '" + promotion + "' " + "AND 	projet.id_session = session_diplome.id_session " + "AND	module.id_module = '" + idModule + "' " + "AND  	projet_module.id_module = module.id_module " + "AND	projet_module.id_projet = projet.id_projet;");
                } else {
                    //REQUETE SQL DE TYPE TOUS LES PROJETS du MODULE (idModule) et de l Intervenant ( idIntervenant ) de LA PROMO (idPromo)
                    reponse = requete.executeQuery("SELECT * " + "FROM 	projet, session_diplome, module, projet_module, formateur, projet_formateur " + "WHERE 	session_diplome.id_session = '" + promotion + "' " + "AND 	projet.id_session = session_diplome.id_session " + "AND	module.id_module = '" + idModule + "' " + "AND 	projet_module.id_module = module.id_module " + "AND	projet_module.id_projet = projet.id_projet " + "AND	formateur.id_formateur = '" + idFormateur + "' " + "AND 	projet_formateur.id_projet = projet.id_projet " + "AND	projet_formateur.id_formateur = formateur.id_formateur;");
                }
            }
        }
        while (reponse.next()) {
            Projet p = new Projet();
            p.setIdProjet(reponse.getInt("id_projet"));
            p.setNom(reponse.getString("nom"));
            p.setPromotion(reponse.getInt("id_session"));
            p.setDateDebut(reponse.getDate("date_debut"));
            p.setDateFin(reponse.getDate("date_fin"));
            p.setDescriptif(reponse.getString("description"));
            listeProjets.add(p);
        }
        reponse.close();
        requete.close();
        c.close();
        return listeProjets;

    }

    /**
     * Recherche de tous les projets d'un etudiant
     *
     * @precondition : l id etudiant doit etre valide
     * @postcondition : la liste contient tous les projets de l etudiant
     *
     * @param idEtudiant id de l'etudiant
     * @return ArrayList<Projet> les projets issus de la recherche.
     * @throws Exception L'execution de la requete sql peut engendrer des Exceptions SQL
     */
    public static ArrayList<Projet> rechercherMesProjetsEtudiants(int idEtudiant) throws Exception {
        Connection c = BaseDeDonnees.seConnecterBD();
        Statement requete = c.createStatement();
        ResultSet reponse;
        ArrayList<Projet> listeProjets = new ArrayList<Projet>();


        reponse = requete.executeQuery("SELECT projet.* FROM   projet,   etudiant,   membre_equipe,   equipe WHERE   membre_equipe.id_equipe = equipe.id_equipe AND  membre_equipe.id_etudiant = etudiant.id_etudiant AND  equipe.id_projet = projet.id_projet AND  membre_equipe.id_etudiant = '" + idEtudiant + "';");

        while (reponse.next()) {
            Projet p = new Projet();
            p.setIdProjet(reponse.getInt("id_projet"));
            p.setNom(reponse.getString("nom"));
            p.setPromotion(reponse.getInt("id_session"));
            p.setDateDebut(reponse.getDate("date_debut"));
            p.setDateFin(reponse.getDate("date_fin"));
            p.setDescriptif(reponse.getString("description"));
            listeProjets.add(p);
        }
        reponse.close();
        requete.close();
        c.close();
        return listeProjets;

    }

    /**
     * Modification d'un projet
     *
     * @precondition : Le projet p doit contenir les modification du projet avec l'id du projet a modifier en BDD.
     * @postcondition : La modification du projet est effectuee en BDD
     * @param p Projet projet possedant les modification a faire en BDD
     * @return String contenant le numero du projet qui a ete modifie
     * @throws Exception L'execution de la requete sql peut engendrer des Exceptions SQL
     */
    public static String modifierProjet(Projet p) throws Exception {

        Connection c = BaseDeDonnees.seConnecterBD();
        Statement requete = c.createStatement();

        requete.execute("UPDATE projet SET nom='" + p.getNom() + "', date_debut='" + p.getDateDebut().toString() + "',date_fin='" + p.getDateFin().toString() + "',	id_session='" + p.getPromotion() + "',	description='" + p.getDescriptif() + "' WHERE id_projet = '" + p.getIdProjet() + "';");
        requete.execute("DELETE FROM projet_formateur WHERE id_projet = '" + p.getIdProjet() + "';");
        requete.execute("DELETE FROM projet_module WHERE id_projet = '" + p.getIdProjet() + "';");
        requete.execute("DELETE FROM equipe WHERE id_projet = '" + p.getIdProjet() + "';");
        //Création des equipes du projet
        for (int i = 0; i < p.getEquipes().size(); i++) {
            requete.execute("INSERT INTO equipe VALUES ((SELECT nextval('equipe_id_equipe_seq')),'" + p.getEquipes().get(i).getNom() + "'," + p.getIdProjet() + ",'Sujet a definir'); ");
            for (int j = 0; j < p.getEquipes().get(i).getEtudiants().size(); j++) {
                requete.execute("INSERT INTO membre_equipe VALUES " + "((SELECT currval('equipe_id_equipe_seq')), " + "'" + p.getEquipes().get(i).getEtudiants().get(j).getIdEtudiant() + "');");
            }
        }
        //Création des formateurs du projet
        for (int i = 0; i < p.getFormateurs().size(); i++) {
            requete.execute("INSERT INTO projet_formateur VALUES ( " + p.getIdProjet() + "," + p.getFormateurs().get(i).getIdFormateur() + ");");
        }
        //Création des matiere associé au projet
        for (int i = 0; i < p.getModules().size(); i++) {
            requete.execute("INSERT INTO projet_module VALUES (" + p.getIdProjet() + ", '" + p.getModules().get(i).getIdModule() + "');");
        }

        requete.close();
        c.close();
        return "" + p.getIdProjet();



    }
}
